package com.google.code.mochaccino.framework.ui.freemarker;
/*
 * Copyright 2012 Claude Houle claude.houle@gmail.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import com.google.code.mochaccino.framework.freemarker.TemplateManager;
import com.google.code.mochaccino.framework.freemarker.exception.TemplateLoadingException;
import com.google.code.mochaccino.framework.freemarker.exception.TemplateNotFoundException;
import com.google.code.mochaccino.framework.freemarker.exception.TemplateRenderingException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.StreamingOutput;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/** A Streaming Output for Templates. */
public class TemplateOutput implements StreamingOutput {

	private Logger             logger     = LoggerFactory.getLogger( getClass() );
	private TemplateManager    manager    = null;
	private String             template   = null;
	private Map<String,Object> parameters = null;

	/**
	 * Constructor
	 *
	 * @param mgr      The Template Manager
	 * @param template The Template Name
	 */
	public TemplateOutput( TemplateManager mgr, String template ) {
		this( mgr, template, null );
	}

	/**
	 * Constructor
	 *
	 * @param mgr        The Template Manager
	 * @param template   The Template Name
	 * @param parameters The Parameteters Map
	 */
	public TemplateOutput( TemplateManager mgr, String template, Map<String,Object> parameters ) {
		this.manager = mgr;
		this.template = template;
		this.parameters = new HashMap<String,Object>();
		if ( parameters != null ) {
			this.parameters.putAll( parameters );
		}
	}

	@Override
	public void write( OutputStream outputStream ) throws IOException, WebApplicationException {

		try {
			manager.processTemplate( template, parameters, outputStream );
		} catch ( TemplateNotFoundException e ) {
			logger.error( e.getMessage(), e );
			throw new WebApplicationException( 500 );
		} catch ( TemplateLoadingException e ) {
			logger.error( e.getMessage(), e );
			throw new WebApplicationException( 500 );
		} catch ( TemplateRenderingException e ) {
			logger.error( e.getMessage(), e );
			throw new WebApplicationException( 500 );
		}
	}
}
